package com.zenithmind.mall.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.common.result.PageResult;
import com.zenithmind.mall.pojo.dto.OrderItemDTO;
import com.zenithmind.mall.pojo.entity.OrderItem;
import com.zenithmind.mall.pojo.query.OrderItemQuery;
import com.zenithmind.mall.pojo.vo.OrderItemVO;

import java.util.List;

/**
 * 订单详情服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-06-09
 */
public interface OrderItemService extends IService<OrderItem> {

    /**
     * 分页查询订单详情
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<OrderItemVO> getOrderItemPage(OrderItemQuery query);

    /**
     * 根据ID获取订单详情
     * 
     * @param id 订单详情ID
     * @return 订单详情
     */
    OrderItemVO getOrderItemById(String id);

    /**
     * 根据订单ID获取订单详情列表
     * 
     * @param orderId 订单ID
     * @return 订单详情列表
     */
    List<OrderItemVO> getOrderItemsByOrderId(String orderId);

    /**
     * 创建订单详情
     * 
     * @param orderItemDTO 订单详情DTO
     * @return 订单详情ID
     */
    String createOrderItem(OrderItemDTO orderItemDTO);

    /**
     * 批量创建订单详情
     * 
     * @param orderItemDTOs 订单详情DTO列表
     * @return 是否成功
     */
    Boolean createOrderItemsBatch(List<OrderItemDTO> orderItemDTOs);

    /**
     * 更新订单详情
     * 
     * @param id 订单详情ID
     * @param orderItemDTO 订单详情DTO
     * @return 是否成功
     */
    Boolean updateOrderItem(String id, OrderItemDTO orderItemDTO);

    /**
     * 删除订单详情
     * 
     * @param id 订单详情ID
     * @return 是否成功
     */
    Boolean deleteOrderItem(String id);

    /**
     * 根据订单ID删除订单详情
     * 
     * @param orderId 订单ID
     * @return 是否成功
     */
    Boolean deleteOrderItemsByOrderId(String orderId);

    /**
     * 批量删除订单详情
     * 
     * @param ids 订单详情ID列表
     * @return 是否成功
     */
    Boolean deleteOrderItemsBatch(List<String> ids);

    /**
     * 获取用户购买过的商品
     * 
     * @param userId 用户ID
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 购买过的商品列表
     */
    PageResult<OrderItemVO> getUserPurchasedProducts(String userId, Integer pageNum, Integer pageSize);

    /**
     * 检查用户是否购买过商品
     * 
     * @param userId 用户ID
     * @param productId 商品ID
     * @return 是否购买过
     */
    Boolean hasUserPurchasedProduct(String userId, String productId);

    /**
     * 获取商品销售统计
     * 
     * @param productId 商品ID
     * @return 销售统计
     */
    ProductSalesStatistics getProductSalesStatistics(String productId);

    /**
     * 获取热销商品
     * 
     * @param limit 限制数量
     * @return 热销商品列表
     */
    List<OrderItemVO> getHotSellingProducts(Integer limit);

    /**
     * 获取用户复购商品
     * 
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 复购商品列表
     */
    List<OrderItemVO> getUserRepurchaseProducts(String userId, Integer limit);

    /**
     * 商品销售统计类
     */
    class ProductSalesStatistics {
        private String productId;
        private String productName;
        private Integer totalQuantity;
        private Integer orderCount;
        private java.math.BigDecimal totalAmount;

        public ProductSalesStatistics(String productId, String productName, Integer totalQuantity, 
                                    Integer orderCount, java.math.BigDecimal totalAmount) {
            this.productId = productId;
            this.productName = productName;
            this.totalQuantity = totalQuantity;
            this.orderCount = orderCount;
            this.totalAmount = totalAmount;
        }

        // getters and setters
        public String getProductId() { return productId; }
        public void setProductId(String productId) { this.productId = productId; }

        public String getProductName() { return productName; }
        public void setProductName(String productName) { this.productName = productName; }

        public Integer getTotalQuantity() { return totalQuantity; }
        public void setTotalQuantity(Integer totalQuantity) { this.totalQuantity = totalQuantity; }

        public Integer getOrderCount() { return orderCount; }
        public void setOrderCount(Integer orderCount) { this.orderCount = orderCount; }

        public java.math.BigDecimal getTotalAmount() { return totalAmount; }
        public void setTotalAmount(java.math.BigDecimal totalAmount) { this.totalAmount = totalAmount; }
    }
}
